package com.qture.Demo;
/*
	匿名内部类细节：
		1. 可以直接访问外部类的所有成员属性、方法，包括私有的；
		2. 不能添加访问权限修饰符，因为它的地位就是一个局部变量；
		3. 作用域：仅仅在定义它的方法代码块中；
		4. 外部其它类不能访问匿名内部类，因为匿名内部类是一个局部变量；
		5. 如果外部类中的成员和匿名内部类的成员重名时，匿名内部类访问外部类成员的话，要遵循就近原则。
			例如：
				内部类访问外部类的成员时，使用 外部类名.this,成员名
*/
public class AnonymousInnerClassDetail {
	public static void main(String[] args) {
		Outer01 o = new Outer01();
		o.method();
	}
}

// 外部类
class Outer01 {
	private String name = "小明";
	private int value = 927;

	public void method(){
		// 创建一个基于类的匿名内部类
		Person01 p = new Person01(){
			@Override
			public void hi() {
				// 可以直接访问外部类的所有成员属性、方法，包括私有的
				// 不能添加访问权限修饰符，因为它的地位就是一个局部变量
				// 作用域：仅仅在定义它的方法代码块中
				System.out.println("你好，匿名内部类重写了hi方法，value = " + value);
				/*
					如果外部类中的成员和匿名内部类的成员重名时，匿名内部类访问外部类成员的话，要使用 外部类名.this,成员名
					注：（不指定默认为使用匿名内部类的成员）
				*/
				System.out.println(Outer01.this.name);
			}
		};
		p.hi();// 动态绑定 运行类型是Outer01$1

		// 第二种方法直接调用匿名内部类（不需要变量来接收）
		new Person01() {
			@Override
			public void hi() {
				System.out.println("你好，匿名内部类重写了hi方法（直接调用）");
			}

			@Override
			public void ok(String str) {
				super.ok(str);
			}
		}.ok("jack");
	}
}

// 类
class Person01 {
	String name = "小宝";

	public void hi(){
		System.out.println("Person的hi方法");
	}

	public void ok(String str){
		System.out.println("Person的ok方法： " + str);
	}
}